<?php

namespace brand\tools;

class Functions{

    /**
     * 下划线转驼峰
     * @param $str
     * @return mixed|string|null
     */
    public static function toCamelCase($str)
    {
        if(!$str) return null;
        $str = mb_ucfirst($str);
        $array = explode('_', $str);
        $result = $array[0];
        $len=count($array);
        if($len>1)
        {
            for($i=1;$i<$len;$i++)
            {
                $result.= ucfirst($array[$i]);
            }
        }
        return $result;
    }

    /**
     * 驼峰转下划线
     * @param $str
     * @return string
     */
    public static function toUnderScore($str)
    {
        $dstr = preg_replace_callback('/([A-Z]+)/',function($matchs)
        {
            return '_'.strtolower($matchs[0]);
        },$str);
        return trim(preg_replace('/_{2,}/','_',$dstr),'_');
    }

    /**
     * 是否以下划线结尾
     * @param $string
     * @param $last
     * @return bool
     */
    public static function endStr($string,$last)
    {
        return substr($string, strpos($string, $last)) === $last;
    }

    /** Json数据格式化
     * @param  Mixed  $data   数据
     * @param  String $indent 缩进字符，默认4个空格
     */
    public static function jsonFormat($data, $indent=null){

        // 对数组中每个元素递归进行urlencode操作，保护中文字符
        array_walk_recursive($data, function ($val){
            if($val!==true && $val!==false && $val!==null){
                urlencode($val);
            }
        });

        // json encode
        $data = json_encode($data);
        // 将urlencode的内容进行urldecode
        $data = urldecode($data);
        // 缩进处理
        $ret = '';
        $pos = 0;
        $length = strlen($data);
        $indent = isset($indent)? $indent : '    ';
        $newline = "\n";
        $prevchar = '';
        $outofquotes = true;
        for($i=0; $i<=$length; $i++){
            $char = substr($data, $i, 1);
            if($char=='"' && $prevchar!='\\'){
                $outofquotes = !$outofquotes;
            }elseif(($char=='}' || $char==']') && $outofquotes){
                $ret .= $newline;
                $pos --;
                for($j=0; $j<$pos; $j++){
                    $ret .= $indent;
                }
            }
            $ret .= $char;
            if(($char==',' || $char=='{' || $char=='[') && $outofquotes){
                $ret .= $newline;
                if($char=='{' || $char=='['){
                    $pos ++;
                }
                for($j=0; $j<$pos; $j++){
                    $ret .= $indent;
                }
            }
            $prevchar = $char;
        }
        return $ret;

    }


}
